最小化Spring xml配置

自动装配Bean属性

Spring提供了4种类型的自动装配:

  1. byName:把与bean的属性具有相同名字或者相同Id的其它Bean自动装配到bean对应的属性中.如果没有跟属性的名字相匹配的bean,则不进行装配.
  2. byType:把与bean的属性具有相同类型的其它Bean自动装配到bean对应的属性中.如果没有跟属性的类型相匹配的bean,则不进行装配.
  3. constructor:把与bean的构造器入参具有相同类型的其它bean自动装配到Bean构造器的对应入参中.
  4. autodetect:首先尝试使用constructor进行自动装配,如果失败,再尝试使用byType进行自动装配.

byName自动装配

1
2
3
4
5
6
<bean id="instrumentallist" class="com.mj.springAction.chapter2.SpringIdo1.Instrumentallist"
autowire="byName">
<property name="song" value="Bells" />
<!-- <property name="instrument" ref="saxophone"/> -->
</bean>
<bean id="instrument" class="com.mj.springAction.chapter2.SpringIdo1.Saxophone" />

byName自动装配遵循一个原则,就是:为属性自动装配ID与该属性名字相同的Bean.

byType自动装配

这种方存在一个缺陷,就是有多个类型相同的bean时,会报错.我们可以设置首选bean,或者取消某个bean的候选资格.但是bean默认的都是首选bean,所以为了达到目的,我们不得不,取消所有类型相同bean的默认首选,使用primary=”false”,然后将要注入的bean设置为首选bean,primary=”true”.
或者取消某些bean的候选资格,使用autowire-candidate=”false”.

constructor自动装配

和byType自动装配有相同的局限性

最佳自动装配

设置autowired=”autodetect”,Spring会优先使用constructor自动装配,如果没有发现与构造器相匹配的bean时,使用byType自动装配.

默认自动装配

default-autowired=”XXX”

使用注解装配

Spring容器默认禁止自动装配,所以,使用前,需要在Spring配置中启用它.

1
<context:annotation-config />

Spring3支持几种不同的用于自动装配的注解:

  • Spring自带的@Autowired注解
  • JSR-330的@Inject注解
  • JSR-250的@Resource注解

使用@Autowired注解

@Autowired可以用来自动装配setter,构造器,甚至是非setter方法注入.
并且不会受限于private关键字,即使是private的,也会自动装配.
但是也有缺点:
应用中必须只能有一个Bean适合装配到@Autowired注解所标注的
属性或者参数中.如果没有匹配的bean或者有多个匹配的Bean,@Autowired注解就会遇到一些麻烦.

可选的自动装配

设置@Autowired(required=false),没有匹配bean也可以接受,而不会抛出空指针.或者NoSuchBeanDefinationException.
这时候如果没有匹配的,bean属性值就会是null.

tips:当使用构造器Autowired时,只有一个构造器可以将required设置为true,其它使用autowired的构造器只能设置为false.此外,当使用autowired标注多个构造器时,spring就会从所有满足装配条件的构造器中选择入参最多的那个构造器.

限定歧义性的依赖

使用Qualifier=”XX”将有多个相同类型的bean限定到一个.
将autowired的byType装配转换成byName装配.

创建自定义的限定器(Qualifier)
1
2
3
4
5
6
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface StringedInsrument {
}

通过自定义的@StringedInsrument 注解,我们现在可以用它代替@Qualifier来标注Guitar:

1
2
3
4
@StringedInsrument
public class Guitar implements Instrument{
...
}

现在我们也可以使用@StringedInsrument对自动装配的Instrument属性进行限定:

1
2
3
@Autowired
@StringedInsrument
private Instrument instrument ;

借助@Inject实现基于标准的自动装配

热评文章